home *** CD-ROM | disk | FTP | other *** search
- unit DBPicker;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
- ComCtrls, DB, DBCtrls;
-
- type
- TDBDateTimePicker = class(TDateTimePicker)
- private
- FDataLink: TFieldDataLink;
- protected
- procedure SetDataSource(Value: TDataSource);
- function GetDataSource: TDataSource;
- procedure SetDataField(const Value: String);
- function GetDataField: String;
- function GetField: TField;
- procedure SetReadOnly(Value: Boolean);
- function GetReadOnly: Boolean;
- procedure DataChange(Sender: TObject);
- procedure UpdateData(Sender: TObject);
- procedure Notification(AComponent: TComponent;
- Operation: TOperation); override;
- procedure CMEnter(var Msg: TCMEnter); message cm_Enter;
- procedure CMExit(var Msg: TCMExit); message cm_Exit;
- procedure CNNotify(var Msg: TWMNotify); message cn_Notify;
- public
- constructor Create(AOwner: TComponent); override;
- destructor Destroy; override;
- property Field: TField read GetField;
- published
- property DataField: String read GetDataField write SetDataField;
- property DataSource: TDataSource read GetDataSource write SetDataSource;
- property ReadOnly: Boolean read GetReadOnly write SetReadOnly;
- end;
-
- procedure Register;
-
- implementation
-
- uses
- CommCtrl;
-
- constructor TDBDateTimePicker.Create(AOwner: TComponent);
- begin
- inherited;
- FDataLink := TFieldDataLink.Create;
- FDataLink.OnDataChange := DataChange;
- FDataLink.OnUpdateData := UpdateData
- end;
-
- destructor TDBDateTimePicker.Destroy;
- begin
- FDataLink.Free;
- FDataLink := nil;
- inherited
- end;
-
- procedure TDBDateTimePicker.SetDataSource(Value: TDataSource);
- begin
- FDataLink.DataSource := Value;
- if Value <> nil then
- Value.FreeNotification(Self)
- end;
-
- function TDBDateTimePicker.GetDataSource: TDataSource;
- begin
- Result := FDataLink.DataSource
- end;
-
- procedure TDBDateTimePicker.SetDataField(const Value: String);
- begin
- FDataLink.FieldName := Value
- end;
-
- function TDBDateTimePicker.GetDataField: String;
- begin
- Result := FDataLink.FieldName
- end;
-
- function TDBDateTimePicker.GetField: TField;
- begin
- Result := FDataLink.Field
- end;
-
- procedure TDBDateTimePicker.SetReadOnly(Value: Boolean);
- begin
- FDataLink.ReadOnly := Value
- end;
-
- function TDBDateTimePicker.GetReadOnly: Boolean;
- begin
- Result := FDataLink.ReadOnly
- end;
-
- procedure TDBDateTimePicker.DataChange(Sender: TObject);
- begin
- if (Field = nil) or
- (FDataLink.DataSet.State = dsInsert) then
- case Kind of //If no data link is set up, show current date or time
- dtkDate: Date := SysUtils.Date;
- dtkTime: Time := SysUtils.Time
- end
- else
- case Kind of //Update control if field changes
- dtkDate: Date := FDataLink.Field.AsDateTime;
- dtkTime: Time := FDataLink.Field.AsDateTime
- end
- end;
-
- procedure TDBDateTimePicker.UpdateData(Sender: TObject);
- begin
- if Kind = dtkDate then //Update field as necessary
- FDataLink.Field.AsDateTime := Date
- else
- FDataLink.Field.AsDateTime := Time
- end;
-
- procedure TDBDateTimePicker.Notification(AComponent: TComponent;
- Operation: TOperation);
- begin
- inherited;
- if (Operation = opRemove) and //Blank out datasource value if
- Assigned(FDataLink) and //datasource is deleted from form
- (AComponent = DataSource) then
- DataSource := nil
- end;
-
- procedure TDBDateTimePicker.CMEnter(var Msg: TCMEnter);
- begin
- Invalidate; //Make sure calendar is up to date upon entry
- inherited
- end;
-
- procedure TDBDateTimePicker.CMExit(var Msg: TCMExit);
- begin
- try //Update other data aware controls when user tabs away
- FDataLink.UpdateRecord
- except
- SetFocus;
- raise
- end;
- inherited
- end;
-
- procedure TDBDateTimePicker.CNNotify(var Msg: TWMNotify);
- begin
- case Msg.NMHdr^.Code of
- dtn_CloseUp: //Update all other data aware controls
- Perform(cm_Exit, 0, 0); //when calendar pops up
- dtn_DateTimeChange: //Update field value when calendar changes
- begin
- FDataLink.Edit;
- FDataLink.Modified;
- end;
- end;
- inherited;
- end;
-
- procedure Register;
- begin
- RegisterComponents('Clinic', [TDBDateTimePicker]);
- end;
-
- end.